From 5000a6a1e0b9c42c17345817e589e61175bad3d0 Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Mon, 9 Oct 2006 13:50:00 +0100 Subject: [PATCH] [XEND] No need to decompress the initrd when building a domain. The guest OS should be capable of parsing an image file in whatever format was produced by that OS's tools. Furthermore, we have seen initrd images with trailing garbage. This causes us to calculate the wrong size for the uncompressed data and hence fail to build the guest. Signed-off-by: Keir Fraser --- tools/libxc/xc_linux_build.c | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/tools/libxc/xc_linux_build.c b/tools/libxc/xc_linux_build.c index 98c84da3b2..594aed0aaf 100644 --- a/tools/libxc/xc_linux_build.c +++ b/tools/libxc/xc_linux_build.c @@ -38,7 +38,7 @@ struct initrd_info { enum { INITRD_none, INITRD_file, INITRD_mem } type; unsigned long len; union { - gzFile file_handle; + int fd; char *mem_addr; } u; }; @@ -152,7 +152,7 @@ int load_initrd(int xc_handle, domid_t dom, } else { - if ( gzread(initrd->u.file_handle, page, PAGE_SIZE) == -1 ) + if ( read(initrd->u.fd, page, PAGE_SIZE) == -1 ) { PERROR("Error reading initrd image, could not"); return -EINVAL; @@ -1344,20 +1344,16 @@ int xc_linux_build(int xc_handle, if ( (initrd_name != NULL) && (strlen(initrd_name) != 0) ) { - initrd_info.type = INITRD_file; - if ( (fd = open(initrd_name, O_RDONLY)) < 0 ) { PERROR("Could not open the initial ramdisk image"); goto error_out; } - initrd_info.len = xc_get_filesz(fd); - if ( (initrd_info.u.file_handle = gzdopen(fd, "rb")) == NULL ) - { - PERROR("Could not allocate decompression state for initrd"); - goto error_out; - } + initrd_info.type = INITRD_file; + initrd_info.u.fd = fd; + initrd_info.len = lseek(fd, 0, SEEK_END); + lseek(fd, 0, SEEK_SET); } sts = xc_linux_build_internal(xc_handle, domid, image, image_size, @@ -1367,8 +1363,8 @@ int xc_linux_build(int xc_handle, error_out: free(image); - if ( initrd_info.type == INITRD_file && initrd_info.u.file_handle ) - gzclose(initrd_info.u.file_handle); + if ( initrd_info.type == INITRD_file ) + close(initrd_info.u.fd); else if ( fd >= 0 ) close(fd); -- 2.30.2